package com.augurit.common.system.service.org;

import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Transactional;
import org.springside.modules.orm.Page;

import com.augurit.common.base.service.IBaseService;
import com.augurit.common.syscode.web.form.SysCodeForm;
import com.augurit.common.system.web.org.form.AcApplicationForm;
import com.augurit.common.system.web.org.form.AcFunctionForm;
import com.augurit.common.system.web.org.form.AcRoleForm;
import com.augurit.common.system.web.org.form.OmGroupForm;
import com.augurit.common.system.web.org.form.OmOrgForm;
import com.augurit.common.system.web.org.form.OmPositionForm;
import com.augurit.common.system.web.org.form.OmUserForm;

/**
 * 角色接口
 */
public interface IAcRoleService extends IBaseService<AcRoleForm, Long> {	

	/**
	 * 根据ID集合获取Form对象列表
	 * @param ids 角色ID集合
	 * @return Form对象列表
	 */
	public List<AcRoleForm> get(Long[] ids);
	
	/**
	 * 根据角色编号查找角色列表
	 * @param roleCode 角色编号
	 * @return
	 */
	public AcRoleForm getRolesByCode(String roleCode);
	
	public List<AcRoleForm> getRolesByCodeList(List<String> roleCodeList);
	
	/**
	 * 保存角色form对象列表
	 * @param forms 角色form对象列表
	 */
	public void save(List<AcRoleForm> forms);
	
	/**
	 * 获取指定角色的角色分页列表
	 * @param page page对象
	 * @param roleIds 角色id数组
	 * @return 包含角色form对象的分页对象
	 */
	public Page<AcRoleForm> getRoles(Page<AcRoleForm> page, Long[] roleIds);
	
	/**
	 * 分页显示所有的角色列表
	 * @param page page对象
	 * @return 包含角色form对象的分页对象
	 */
	public Page<AcRoleForm> getAllRoles(Page<AcRoleForm> page);
	
	/**
	 * 多条件分页查询所有的角色列表
	 * @param page page对象，包含分页参数
	 * @param form form对象，包含查询条件
	 * @return 分页对象
	 */
	public Page<AcRoleForm> getAllRoles(Page<AcRoleForm> page, AcRoleForm form);
	
	/**
	 * 获取所有的角色列表
	 * @return 角色form对象列表
	 */
	public List<AcRoleForm> getAllRoles();
	
	/**
	 * 获取指定机构所关联的角色列表
	 * @param orgId 机构ID
	 * @return 角色form对象列表
	 */
	public List<AcRoleForm> getRolesByOrgId(Long orgId);
	
	/**
	 * 获取指定岗位所关联的角色列表
	 * @param posId 岗位ID
	 * @return 角色form对象列表
	 */
	public List<AcRoleForm> getRolesByPosId(Long posId);
	
	/**
	 * 获取指定工作组所关联的角色列表
	 * @param groupId 工作组ID
	 * @return 角色form对象列表
	 */
	public List<AcRoleForm> getRolesByGroupId(Long groupId);
	
	/**
	 * 获取指定工作组所关联的角色分页列表
	 * @param groupId 工作组id
	 * @param page 分页对象
	 * @return 角色form分页对象
	 */
	public Page<AcRoleForm> getRolesByGroupId(Long groupId, Page<AcRoleForm> page);
	
	/**
	 * 获取指定用户直接关联的角色列表
	 * @param userId 用户ID
	 * @return 角色form对象列表
	 */
	public List<AcRoleForm> getDirectRolesByUserId(Long userId);
	
	/**
	 * 获取指定用户直接或间接关联的角色列表
	 * @param userId 用户ID
	 * @return 角色form对象列表
	 */
	public List<AcRoleForm> getAllRolesByUserId(Long userId);

	/**
	 * 获取指定用户直接或间接关联的角色列表
	 * @param userId 用户ID
	 * @return 角色id数组
	 */
	public Long[] getAllRoleIdsByUserId(Long userId);
	
	/**
	 * 获取指定用户间接（继承的）关联的角色
	 * @param userId 用户ID
	 * @return 角色ID集合
	 */
	public Long[] getExtendRoleIdsByUserId(Long userId);
	
	/**
	 * 获取指定用户继承的角色ID集合
	 * @param userId 用户ID
	 * @return 角色Form对象列表
	 */
	public List<AcRoleForm> getExtendedRolesByUserId(Long userId);
	
	/**
	 * 获取指定角色具有的功能列表
	 * @param roleId 角色id
	 * @return 功能form对象列表
	 */
	public List<AcFunctionForm> getFuncsByRoleId(Long roleId, Map<Long, AcApplicationForm> appMapBuffer);
	
	/**
	 * 获取指定角色ID获取功能ID集合
	 * @param roleId 角色ID
	 * @return 功能ID集合
	 */
	public Long[] getFuncIdsByRoleId(Long roleId);
	
	/**
	 * 获取指定用户的功能id
	 * @param userId 用户id
	 * @return 功能id数组
	 */
	public Long[] getFuncIdsByUserId(Long userId);
	
	/**
	 * 获取指定用户及角色id集所对应的功能id
	 * @param userId 用户id
	 * @param roleIds 角色id数组
	 * @return 功能id数组
	 */
	public Long[] getFuncIdsByUserIdAndRoleIds(Long userId, Long[] roleIds);
	
	/**
	 * 获取拥有指定功能的用户id集合
	 * @param funcId 功能id
	 * @return 用户id数组
	 */
	public Long[] getUserIdsByFuncId(Long funcId);
	
	
	/**
	 * 获取拥有指定功能的角色id集合
	 * @param funcId 功能id
	 * @return 角色id数组
	 */
	public Long[] getRoleIdsByFuncId(Long funcId);
	
	/**
	 * 获取指定用户的功能id
	 * @param userId 用户id
	 * @return 功能id数组
	 */
	public Long[] getFuncIdsByRoleIds(Long[] roleIds);
	
	/**
	 * 添加角色
	 * @param form 角色form对象
	 */
	public void addRoleCascade(AcRoleForm form);
	
	/**
	 * 删除角色
	 * @param roleId 角色id
	 */
	public void deleteRoleCascade(Long roleId);
	
	/**
	 * 删除角色列表
	 * @param roleIds 角色id数组
	 */
	public void deleteRoleCascade(Long[] roleIds);
	
	/**
	 * 向指定角色中添加指定功能
	 * @param roleId 角色id;
	 * @param funcId 功能id;
	 */
	public void associateFuncToRole(Long roleId, Long funcId);
	
	/**
	 * 向指定角色中添加指定功能列表
	 * @param roleId 角色id
	 * @param funcIds 功能id列表
	 */
	public void associateFuncToRole(Long roleId, Long[] funcIds);
	
	/**
	 * 向指定角色中添加指定模块
	 * @param roleId 角色id
	 * @param moduleId 模块id
	 */
	public void associateModuleToRole(Long roleId, Long moduleId);
	
	/**
	 * 向指定角色中添加指定模块列表
	 * @param roleId 角色id
	 * @param moduleIds 模块ids
	 */
	public void associateModuleToRole(Long roleId, Long[] moduleIds);
	
	/**
	 * 向指定角色中添加应用
	 * @param roleId 角色id
	 * @param appId 应用id
	 */
	public void associateAppToRole(Long roleId, Long appId);
	
	/**
	 * 向指定角色中添加应用列表
	 * @param roleId 角色id
	 * @param appIds 应用id
	 */
	public void associateAppToRole(Long roleId, Long[] appIds);
	
	/**
	 * 使指定角色不具有某项功能
	 * @param roleId 角色id
	 * @param funcId 功能id  
	 */
	public void disAssociateFuncFromRole(Long roleId, Long funcId);
	
	/**
	 * 使指定角色不具有多项功能
	 * @param roleId 角色id
	 * @param funcIds 功能id数组 
	 */
	public void disAssociateFuncFromRole(Long roleId, Long[] funcIds);
	
	/**
	 * 使指定角色不具有某一个模块的功能
	 * @param roleId 角色id
	 * @param moduleId 模块id
	 */
	public void disAssociateModuleFromRole(Long roleId, Long moduleId);
	
	/**
	 * 使指定角色不具有某一应用的功能
	 * @param roleId 角色id
	 * @param appId 应用id 
	 */
	public void disAssociateAppFromRole(Long roleId,Long appId);
	
	/**
	 * 获取与指定角色关联的用户id集合
	 * @param roleId 角色id
	 * @return  用户id数组
	 */
	public Long[] getUserIdsByRoleId(Long roleId);
	
	/**
	 * 根据角色id获取具有该角色的机构id
	 * @param roleId 角色id
	 * @return 机构id数组
	 */
	public Long[] getOrgIdsByRoleId(Long roleId);
	
	/**
	 * 根据角色id获取具有该角色的岗位id
	 * @param roleId 角色id
	 * @return 岗位id数组
	 */
	public Long[] getPosIdsByRoleId(Long roleId);
	
	/**
	 * 分页查询与指定角色关联的所有用户
	 * @param page 分页参数
	 * @param roleId 角色id
	 * @return 包含用户form对象的分页对象
	 */
	public Page<OmUserForm> getUsersByDirectRoleId(Page<OmUserForm> page, Long roleId);
	
	/**
	 * 查询与指定角色关联的所有用户
	 * @param roleId 角色id 
	 * @return 用户form对象
	 */
	public List<OmUserForm> getUsersByDirectRoleId(Long roleId);
	
	/**
	 * 查询与指定角色关联的所有用户
	 * @param roleId
	 * @return
	 */
	public List<OmUserForm> getUsersByDirectRoleCode(String roleCode);

	/**
	 * 查询不与指定角色关联的用户列表
	 * @param roleId 角色id
	 * @return 用户form对象
	 */
	public List<OmUserForm> getUsersNotAssociateRole(Long roleId);
	
	/**
	 * 分页查询不与指定角色关联的用户列表
	 * @param page 分页对象
	 * @param roleId 角色id
	 * @param userForm 用户form对象，包含查询条件
	 * @return 包含用户form的分页对象
	 */
	public Page<OmUserForm> getUsersNotAssociateRole(Page<OmUserForm> page,Long roleId, OmUserForm userForm);
	
	
	
	/**
	 * 分页查询指定用户id未授权的角色
	 * @param page 分页对象
	 * @param userId 用户id
	 * @return 角色form对象
	 */
	public Page<AcRoleForm> getRolesNotAssociateUser(Page<AcRoleForm> page, Long authUserId, Long authedUserId);
	
	/**
	 * 分页查询与指定角色关联的所有机构
	 * @param page 分页参数
	 * @param roleId 角色id
	 * @return 包含机构form对象的分页对象
	 */
	public Page<OmOrgForm> getOrgsByRole(Page<OmOrgForm> page, Long roleId, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 分页查询与指定角色关联的所有工作组
	 * @param page
	 * @param roleId
	 * @param sysCodeBuffer
	 * @return
	 */
	public Page<OmGroupForm> getGroupsByRole(Page<OmGroupForm> page, Long roleId, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 分页查询不与指定角色关联的所有机构
	 * @param page 分页参数
	 * @param roleId 角色id
	 * @param orgForm 机构form对象
	 * @return 包含机构form对象的分页对象
	 */
	public Page<OmOrgForm> getOrgsNotAssociateRole(Page<OmOrgForm> page, Long roleId, OmOrgForm orgForm, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 分页查询不与指定角色关联的所有工作组
	 * @param page 分页参数
	 * @param roleId 角色id
	 * @param groupForm 工作组form对象
	 * @return 包含工作组form对象的分页对象
	 */
	public Page<OmGroupForm> getGroupsNotAssociateRole(Page<OmGroupForm> page, Long roleId, OmGroupForm groupForm, Map<String, List<SysCodeForm>> sysCodeBuffer);
	/**
	 * 查询与指定角色关联的机构
	 * @param roleId 角色id 
	 * @return 包含机构form对象的分页对象
	 */
	
	public List<OmOrgForm> getOrgsByRole(Long roleId);
	/**
	 * 查询不与指定角色关联的机构
	 * @param roleId 角色id
	 * @return 包含机构form对象的分页对象
	 */

	public List<OmOrgForm> getOrgsNotAssociateRole(Long roleId);
	
	/**
	 * 分页查询与指定角色关联的所有岗位
	 * @param page 分页参数
	 * @param roleId 角色id 
	 * @return 包含岗位form对象的分页对象
	 */
	public Page<OmPositionForm> getPositionsByRole(Page<OmPositionForm> page, Long roleId);

	/**
	 * 分页查询不与指定角色关联的所有岗位
	 * @param page 分页参数
	 * @param roleId 角色id 
	 * @param posForm 岗位form
	 * @return 包含岗位form对象的分页对象
	 */
	public Page<OmPositionForm> getPositionsNotAssociateRole(Page<OmPositionForm> page, Long roleId, OmPositionForm posForm);
	
	/**
	 * 查询与指定角色关联的岗位
	 * @param roleId 角色id
	 * @return 包含岗位form对象的分页对象
	 */
	public List<OmPositionForm> getPositionsByRole(Long roleId);
	
	/**
	 * 查询不与指定角色关联的岗位
	 * @param roleId 角色id
	 * @return 包含岗位form对象的分页对象
	 */
	public List<OmPositionForm> getPositionsNotAssociateRole(Long roleId);
	
	/**
	 * 分配指定的角色给指定的用户
	 * @param roleId 角色id
	 * @param userIds 用户id数组
	 */
	public void assignRoleToUser(Long roleId, Long... userIds);
	
	/**
	 * 分配指定的角色给指定的机构
	 * @param roleId 角色id 
	 * @param orgIds 机构id数组
	 */
	public void assignRoleToOrg(Long roleId, Long... orgIds);
	
	/**
	 * 分配指定的角色给指定的工作组
	 * @param roleId 角色id 
	 * @param groupIds 机构id数组
	 */
	public void assignRoleToGroup(Long roleId, Long... groupIds);
	
	/**
	 * 分配指定的角色给指定的职位
	 * @param roleId 角色id
	 * @param posIds 岗位id数组
	 */
	public void assignRoleToPosition(Long roleId, Long... posIds);
	
	/**
	 * 使指定用户不具有指定角色
	 * @param roleId 角色id
	 * @param userId 用户id
	 */
	public void disAssociateRoleFromUser(Long roleId, Long userId);
	
	/**
	 * 使指定用户列表不具有指定角色
	 * @param roleId 角色id 
	 * @param userIds 用户id数组
	 */
	public void disAssociateRoleFromUser(Long roleId,Long[] userIds);
	
	/**
	 * 使指定的机构不具有指定角色
	 * @param roleId 角色id
	 * @param orgIds 机构ids数组
	 */
	public void disAssociateRoleFromOrg(Long roleId,Long... orgIds);
	
	/**
	 * 使指定岗位不具有指定角色
	 * @param roleId 角色id 
	 * @param posIds  岗位id数组
	 */
	public void disAssociateRoleFromPos(Long roleId,Long... posIds);
	
	/**
	 * 使指定工作组不具有指定角色
	 * @param roleId 角色id 
	 * @param groupIds 工作组id数组
	 */
	public void disAssociateRoleFromGroup(Long roleId,Long...groupIds);
	
	/**
	 * 根据用户id分页获取用户本身的角色列表
	 * @author 舒军
	 * @param userId 用户id
	 * @param page 分页对象
	 * @return 用户本身的角色分页列表
	 * */
	public Page<AcRoleForm> getRolePageByUserId(Long userId,Page<AcRoleForm> page);
	
	/**
	 * 获取与指定机构不关联AcRoleForm列表
	 * @author 舒军
	 * @param orgIdId 机构id
	 * @return AcRoleForm列表
	 * */
	public Page<AcRoleForm> getRolesUnAssociateOrg(Long orgId,Page<AcRoleForm> page);
	
	/**
	 * 获取与指定工作组不关联AcRoleForm列表
	 * @param groupId 工作组id
	 * @return AcRoleForm列表
	 */
	public Page<AcRoleForm> getRolesUnAssociateGroup(Long groupId,Page<AcRoleForm> page);
	
	/**
	 * 获取与指定岗位不关联AcRoleForm列表
	 * @author 舒军
	 * @param orgIdId 岗位id
	 * @return AcRoleForm列表
	 * */
	public Page<AcRoleForm> getRolesUnAssociatePos(Long posId,Page<AcRoleForm> page);
	
	/**
	 * 根据工作组id删除关联角色
	 */
	public void disAssociationRoleFromGroup(Long groupId);
	
	/**
	 * 根据机构ID删除关联角色
	 */
	public void disAssociationRoleByOrgId(Long orgId);
	
	/**
	 * 查询与指定角色关联的所有用户
	 * @param roleId
	 * @return
	 */
	public List<OmUserForm> getUsersByDirectRole(Long roleId);
	
	//判断角色表中是否有匹配的记录
	public boolean hasRoleLikeKeyword(List<AcRoleForm> list,String keyword);
	public boolean isRoleLikeKeyword(Long roleId,String keyword);

	/**
	 * 查询角色的用户并过滤,用于区的人员选择
	 * @param roleId角色id
	 * @param orgId登录用户的机构id
	 * @return
	 */
	public List<OmUserForm> getUsersByDirectRoles(Long roleId, Long orgId);
}
